import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是应用程序的根。
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '你好，Flutter',
      theme: ThemeData(
        // 这是应用程序的主题。
        //
        // 尝试运行应用程序并观察应用栏的颜色。然后，在不退出应用程序的情况下，
        // 尝试将下面颜色方案中的 seedColor 更改为 Colors.green，然后调用“热重载”
        // （在支持 Flutter 的 IDE 中保存更改或按“热重载”按钮，或者如果使用命令行启动应用程序，则按“r”）。
        //
        // 注意计数器没有重置回零；应用程序状态在重载期间不会丢失。要重置状态，请使用热重启。
        //
        // 这对代码也有效，而不仅仅是值：大多数代码更改可以通过简单的热重载来测试。
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: '点击右下角按钮+1'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  // 这个小部件是应用程序的主页。它是有状态的，意味着它有一个包含影响其外观的字段的状态对象（定义在下面）。

  // 这个类是状态的配置。它保存了父级（在这种情况下是 App 小部件）提供的值（在这种情况下是标题）
  // 并在状态的 build 方法中使用。小部件子类中的字段始终标记为“final”。
  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // 这个对 setState 的调用告诉 Flutter 框架状态已更改，这会导致下面的 build 方法重新运行
      // 以使显示反映更新的值。如果我们更改 _counter 而不调用 setState，则 build 方法不会再次调用，
      // 因此不会有任何变化。
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    // 每次调用 setState 时都会重新运行这个方法，例如上面的 _incrementCounter 方法所做的那样。
    //
    // Flutter 框架已经优化，使重新运行构建方法变得快速，因此你可以重建任何需要更新的内容，
    // 而不是单独更改小部件的实例。
    return Scaffold(
      appBar: AppBar(
        // 尝试在这里将颜色更改为特定颜色（例如 Colors.amber），然后触发热重载，以查看应用栏
        // 颜色发生变化，而其他颜色保持不变。
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        // 这里我们从 App.build 方法创建的 MyHomePage 对象中获取值，并将其设置为应用栏的标题。
        title: Text(widget.title),
      ),
      body: Center(
        // Center 是一个布局小部件。它接受一个子小部件并将其定位在父级的中间。
        child: Column(
          // Column 也是一个布局小部件。它接受一个子小部件列表并将它们垂直排列。默认情况下，
          // 它会在水平方向上适应其子小部件的大小，并尝试与其父级一样高。
          //
          // Column 有许多属性可以控制其大小和子小部件的位置。这里我们使用 mainAxisAlignment
          // 将子小部件垂直居中；主轴在这里是垂直轴，因为 Columns 是垂直的（交叉轴将是水平的）。
          //
          // 尝试调用“调试绘制”（在 IDE 中选择“切换调试绘制”操作，或在控制台中按“p”），
          // 以查看每个小部件的线框。
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '您已经按下按钮这么多次：',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ), // 这个尾随逗号使自动格式化在构建方法中看起来更好。
    );
  }
}
